/**
 *  发布订阅模式
 *      发布订阅模式有很多写法
 *      今天这个是简单的版本，但是比较通用
 */

interface EventsList {
    [index: string]: Function[]
}

// 订阅发布对象的类型约束
interface IEventSystem {
    // 用来存 函数的数组
    events: EventsList;
    // 订阅方法
    on: (key: string, callback: Function) => void;
    // 发布方法
    emit: (key: string) => void;
}


export const EventSys: IEventSystem = {
    // 使用一个数组把对应的 要做的操作和对应的函数 装起来
    events: {},
    // 用来订阅的方法
    on(key: string, callback: Function) {
        if (!this.events[key]) {
            this.events[key] = [];
        }
        // 把传入的函数，使用数组存起来
        this.events[key].push(callback)
    },
    // 用来发布的方法
    emit(key: string) {
        // 根据key，找到数组，把里面的函数全都调用
        if (this.events[key]) {
            this.events[key].forEach(fn => fn())
        }
    }
}